#ifndef unix
#define WIN32
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

#define ERRO_MSG "Erro %d\n-------------\n%s.\n"

#define ERRO_01 "QUANTIDADE DE ARGUMENTOS INVÁLIDOS"
#define ERRO_02 "PORTA INVALIDA"
#define ERRO_03 "DATA INVALIDA"
#define ERRO_04 "HORA INVALIDA"
#define ERRO_05 "A HORA FINAL NÃO PODE VIR ANTES DA HORA INICIAL, OU SER A MESMA HORA"
#define ERRO_06 "COMANDO NAO SE ENCAIXA EM NENHUMA REGRA CONHECIDA"
#define ERRO_07 "ISSO DEFINITIVAMENTE NAO EH UM NUMERO. CUIDADO."
#define ERRO_08 "FORMATO DO USER_NAME INVÁLIDO, EX.: <nome>.<sobrenome> Máximo 20 caracteres."
#define ERRO_09 "Senhá inválida possui mais de 20 carateres."
#define ERRO_10 "PROBLEMAS AO RECEBER RESPOSTA DO SERVIDOR."

#define LOGIN       1
#define ADD         2
#define REMOVEALL   3
#define REMOVE      4
#define UPDATE      5
#define GET         6
#define GETALL      7

typedef struct{
    int protocolo;
    char host[30];
    int porta;
    char usuario[21];
    char senha[21];
    char comandos[150];
} Comando;

// Constantes
int porta;
Comando comando;

/* Definindo a porta default para o protocolo */
extern int errno;


//Funções Auxiliares.
void isNumero(const char*);
void printComando(Comando*);
void validaData(const char *);
int validaHora(const char *);
int matchUsername(const char *);
void handlerRetorno(char *, const char*);
void handlerRetornoGet(char *, const char*);
int handlerRetornoGetAllQtde(char *, const char*);
void handlerRetornoGetAll(char *);

//Funções de Montagem de Comando.
void comandoAdd(Comando*, const char*, const char*, const char*, const char*);
void comandoRemoveAll(Comando*,const char*);
void comandoRemove(Comando*, const char*, const char*);
void comandoUpdate(Comando*, const char*, const char*, const char*, const char*);
void comandoGetAll(Comando*,const char*);
void comandoGet(Comando*, const char*, const char*);
